package puzzlegame.ui;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GameJFrame extends JFrame implements KeyListener, ActionListener {


     int[][] data = new int[4][4];
     //记录空白方块在二维数组中的位置
     int x = 0;
     int y = 0;
     //统计步数
     int step = 0;
     int[][] win = {
             {1,2,3,4},
             {5,6,7,8},
             {9,10,11,12},
             {13,14,15,0}
     } ;
     //创建选项下的条目对象
     JMenuItem replayItem = new JMenuItem("重新游戏");
     JMenuItem closeItem = new JMenuItem("关闭游戏");
     JMenuItem accountItem = new JMenuItem("公众号");

     public GameJFrame() {
          //初始化界面
          initJFrame();
          //初始化菜单
          initJFrameBar();
          //初始化数据(打乱)
          initData();
          //初始化图片(打乱之后)
          initImage();
          //显示
          this.setVisible(true);
     }
     private void initData() {
          //先创建一个一维数组
          int[] tempArr ={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
          Random r = new Random();
          for (int i = 0; i < tempArr.length; i++) {
               int index = r.nextInt(tempArr.length);
               int temp = tempArr[i];
               tempArr[i] = tempArr[index];
               tempArr[index] = temp;
          }
          //给二维数组添加数据
          for (int i = 0; i < tempArr.length; i++) {
              if(tempArr[i] == 0){
                   x=i/4;
                   y=i%4;

              }else{
                   data[i/4][i%4] = tempArr[i];
               }
          }

          }



     private void initImage() {
               //清空原本已经出现的所有图片
          this.getContentPane().removeAll();
          if(victory()){
               JLabel winJlabel = new JLabel(new ImageIcon("D:\\SCK\\java练习\\Test_Demo1\\win\\win.png"));
               winJlabel.setBounds(326,370,185,83);
               this.getContentPane().add(winJlabel);
          }
              JLabel stepCount = new JLabel("当前步数:" + step);
              stepCount.setBounds(50,30,200,110);
              this.getContentPane().add(stepCount);
          for(int i = 0; i< 4; i++) {
               for (int j = 0; j < 4; j++) {
                    int num =data[i][j];
                  JLabel jLabel = new JLabel(new ImageIcon("D:\\SCK\\java练习\\Test_Demo1\\蛋蛋\\images\\"+num+".png"));
                    //指定图片位置
                    jLabel.setBounds(113*j+175, 113*i+189, 113, 113);
                    //给图片添加边框
                    jLabel.setBorder(new BevelBorder(0));
                    //把管理容器添加到界面
                    this.getContentPane().add(jLabel);
               }
          }
          //添加背景图片
          JLabel background = new JLabel(new ImageIcon("D:\\SCK\\java练习\\Test_Demo1\\Screenshot 2024-07-06 130446.png"));
          background.setBounds(50, 38, 700, 700);
          this.getContentPane().add(background);
          //刷新界面
          this.getContentPane().repaint();
          }
     private void initJFrameBar() {
          //初始化菜单
          //创建整个菜单对象
          JMenuBar JMenuBar = new JMenuBar();
          //创建菜单里两个选项的对象
          JMenu FuctionJMenu = new JMenu("功能");
          JMenu aboutJMenu = new JMenu("关于我们");



          //添加
          JMenuBar.add(FuctionJMenu);
          JMenuBar.add(aboutJMenu);


          FuctionJMenu.add(replayItem);
          FuctionJMenu.add(closeItem);

          replayItem.addActionListener(this);
          closeItem.addActionListener(this);
          accountItem.addActionListener(this);

          aboutJMenu.add(accountItem);
          //给整个界面设置菜单
          this.setJMenuBar(JMenuBar);
     }

     private void initJFrame() {
          //设置界面的宽高
          this.setSize(800,800);
          //设置界面的标题
          this.setTitle("蛋蛋拼图小游戏单机版 v.1.0");
          //设置界面置顶
          this.setAlwaysOnTop(true);
          //设置界面居中
          this.setLocationRelativeTo(null);
          //设置关闭模式
          this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
          //取消默认居中位置,按照xy轴的形式添加组件
          this.setLayout(null);
          //给整个界面添加键盘监听事件
          this.addKeyListener(this);
     }

     @Override
     public void keyTyped(KeyEvent e) {

     }

     @Override
     public void keyPressed(KeyEvent e) {
      int code = e.getKeyCode();
      if(code == 68){
           //把界面中所有图片都删除
           this.getContentPane().removeAll();
           //加载完整图片
           JLabel all = new JLabel(new ImageIcon("D:\\SCK\\java练习\\Test_Demo1\\alldandan\\dan.jpg"));
           all.setBounds(175,189,453,453);
           this.getContentPane().add(all);
           //加载背景图片
           JLabel background = new JLabel(new ImageIcon("D:\\SCK\\java练习\\Test_Demo1\\Screenshot 2024-07-06 130446.png"));
           background.setBounds(50, 38, 700, 700);
           this.getContentPane().add(background);
           //刷新界面
           this.getContentPane().repaint();
      }
     }

     @Override
     public void keyReleased(KeyEvent e) {
          if (victory()){
               return;
          }
          int code = e.getKeyCode();
          //向左移动
          if(code == 37){
               if(y == 3){
                    return;
               }
          data[x][y] = data[x][y+1];
          data[x][y+1] = 0;
          y++;
          step++;
          initImage();
          }
          //向上移动
         else if(code == 38){
               if(x == 3){
                    return;
               }
         data[x][y] = data[x+1][y];
         data[x+1][y] = 0;
         x++;
         step++;
         initImage();
          }
          //向右移动
          else if(code == 39){
               if(y == 0){
                    return;
               }
               data[x][y] = data[x][y-1];
               data[x][y-1] = 0;
               y--;
               step++;
               initImage();

          }
          //向下移动
          else if(code == 40){
               if(x == 0){
                    return;
               }
               data[x][y] = data[x-1][y];
               data[x-1][y] = 0;
               x--;
               step++;
               initImage();
          }
        else if(code == 68){
             initImage();
          }
        else if(code == 65){
             data =new int[][]{
                     {1,2,3,4},
                     {5,6,7,8},
                     {9,10,11,12},
                     {13,14,15,0}
               };
             initImage();
          }
     }
     public void actionPerformed(ActionEvent e) {
       //获取当前被点击条目对象
          Object obj = e.getSource();
          //判断
          if(obj == replayItem){
               System.out.println("重新游戏");
               step = 0;
               //再次打乱二维数组中的数据
               initData();
               //重新加载图片
               initImage();
          }

          else if(obj == closeItem){
               System.out.println("关闭游戏");
               System.exit(0);
          }
          else if(obj == accountItem){
               System.out.println("公众号");
          }
     }
     //判断data数组中的数据是否与win中的相同
     public boolean victory(){
          for(int i = 0 ; i < data.length;i++){
               for(int j = 0 ; j < data[i].length;j++){
                    if(data[i][j] != win[i][j]){
                         return false;
                    }
               }
          }
          return true;
     }
}
